Làm cách nào để đảm bảo cổng SSH chỉ mở với một địa chỉ IP cụ thể?


42

Đây là của tôi /etc/sysconfig/iptables:

Nó có hai cổng mở 80 apache và 22 cho ssh.

# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

Đối với cổng 22 (SSH) tôi muốn đảm bảo không ai có thể kết nối với cổng này ngoại trừ một địa chỉ IP cụ thể.

ví dụ ip:

1.2.3.4

Vui lòng bỏ qua mọi sự giám sát / lo ngại về điều gì nếu ip của tôi thay đổi và tôi không thể SSH đến máy chủ của mình nữa.

Câu trả lời:


47

Nếu tôi nhận được câu hỏi đúng cách, bạn muốn máy chủ của mình chỉ có thể truy cập được từ địa chỉ IP cụ thể trên cổng 22, bạn có thể cập nhật Iptables cho việc này:

iptables -A INPUT -p tcp -s YourIP --dport 22 -j ACCEPT

Trong trường hợp đó, bạn chỉ mở cổng ssh cho YourIP, nếu bạn cần mở DNS cho mạng nội bộ của mình:

iptables -A INPUT -p udp -s YourIP --dport 53 -j ACCEPT
iptables -A INPUT -p tcp -s YourIP --dport 53 -j ACCEPT

Khi bạn đã thêm và mở chúng cho các IP đó, bạn cần đóng cửa cho các IP còn lại

iptables -A INPUT -p tcp -s 0.0.0.0/0 --dport 22 -j DROP
iptables -A INPUT -p udp -s 0.0.0.0/0 --dport 53 -j DROP
iptables -A INPUT -p tcp -s 0.0.0.0/0 --dport 53 -j DROP

(Đảm bảo đặt quy tắc ở vị trí chính xác trong quy tắc của bạn. iptables -A INPUTSẽ thêm quy tắc vào cuối của quy tắc INPUTnhư hiện tại.)

hoặc như joel đã nói, bạn có thể thêm một quy tắc thay thế:

iptables -A INPUT -p tcp ! -s <permittedIP> -j DROP

hoặc bạn chỉ có thể đặt chính sách mặc định trên tường lửa với

iptables -P INPUT DROP

Tóm lại, như được trình bày trong câu hỏi này trên SO :

iptables -A INPUT -p tcp --dport 22 -s YourIP -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP

2
Cũng đáng lưu ý rằng iptableshỗ trợ đảo ngược với toán tử bang trong trường hợp bạn muốn thực hiện một mục tiêu DROP. Ví dụ:iptables -I INPUT -p tcp ! -s <permittedIP> -j DROP
Bratchley

1
Ngoài ra, DROPkhông thực sự cần thiết, bạn chỉ có thể đặt chính sách mặc định trên tường lửa iptables -P INPUT DROPvà để nó đi vào đó. Bạn cũng có thể muốn thực hiện chúng như một phần bổ sung nếu thực hiện theo cách này nếu không tất cả lưu lượng truy cập sẽ bị bắt bởi DROPvà không bao giờ đạt được ACCEPTquy tắc của bạn .
Bratchley

1
Điều này không phù hợp với tôi vì mặc định cho -I (insert) là chèn theo quy tắc số 1, do đó DROP được chèn theo quy tắc số 1 và được đánh giá trước và do đó loại bỏ tất cả các gói ssh, không bao giờ đánh giá quy tắc ACCEPT. Bạn phải thực thi iptables -I INPUT 3 -p tcp -s 0.0.0.0/0 --dport 22 -j DROPiptables -I INPUT 3 -p udp -s 0.0.0.0/0 --dport 53 -j DROP"3" sau INPUT có nghĩa là chèn theo quy tắc INPUT # 3 (giả sử bạn đang chèn hai CHẤP NHẬN, nếu không, chỉ cần một CHẤP NHẬN thì hãy sử dụng "2" cho INPUT.
Kevin Triplett

@Networker Sử dụng -Isẽ chèn các quy tắc iptables mới ở trên cùng. Vì vậy, bạn có thể kết thúc việc giảm giá trước khi cho phép. Tôi đề nghị sử dụng -Athay thế
BlueCacti

1
tôi cũng tự nhốt mình, gj
ngwdaniel

6

Mặc dù tôi khuyên bạn nên sử dụng các khóa SSH, tôi sẽ giải thích cho bạn.

Bạn không phải sử dụng IPtables cho những gì bạn đang cố gắng đạt được, có nhiều cách. Đây là cách IPtables:

iptables -I INPUT -s [YOUR_HOME_IP] -p tcp -m tcp --dport [SSH_PORT] -j ACCEPT

[YOUR_HOME_IP] = IP nhà của bạn (khá đơn giản)

[SSH_PORT] = Cổng mà bạn chạy SSH trên (theo mặc định 22)

iptables -I INPUT -p tcp -m tcp --dport [SSH_PORT] -j REJECT

Điều này đảm bảo không ai ngoại trừ IP của bạn có thể đăng nhập vào SSH.

Có một cách khác, đó là bằng cách thêm một cái gì đó vào sshd_config.

Thêm những điều sau:

AllowUsers root@[YOUR_HOME_IP]
PermitRootLogin without-password

Điều này cho phép bạn đăng nhập vào SSH với tư cách là rootngười dùng từ IP của bạn mà không yêu cầu mật khẩu.

Hãy nhớ rằng một cronjob với

iptables -X
iptables -F

có thể thông minh để bạn không bị khóa khỏi máy chủ của mình bằng SSH (cronjob sẽ đặt lại IPtables để bạn sẽ có quyền truy cập lại). Nếu bạn vẫn có quyền truy cập, bạn có thể xóa cronjob và thiết lập lại IPtables của mình.


Các cronjob sẽ chỉ loại bỏ các tường lửa mặc dù. Tại sao thiết iptableslập ở nơi đầu tiên? Một số hình thức ra khỏi truy cập ban nhạc là phương pháp thông thường xung quanh. knockdlà một cái khác.
Matt

@mtm Có, khi bạn bị khóa, cronjob sẽ đặt lại thiết lập IPtables của bạn để bạn có thể truy cập lại SSH. Lý do tại sao mọi người sử dụng IPtables là khác nhau, ý kiến ​​của tôi là nó là một tường lửa hiệu quả, đơn giản và linh hoạt.
William Edwards

2
oic bạn có nghĩa là chạy tuôn ra một lần tại thời điểm thiết lập, không thường xuyên theo lịch trình. atlàm điều đó
Matt

4
Danh sách trắng chỉ IP của bạn và sau đó cho phép đăng nhập root mà không cần mật khẩu có vẻ là một ý tưởng tồi tệ.
Alex W

1
@AlexW Tôi biết đã được một lúc nhưng tôi vẫn muốn bình luận: Without-Passwordcó nghĩa là xác thực mật khẩu không được phép, vì vậy bạn sẽ phải sử dụng xác thực khóa SSH thay thế. Đó thực sự là một chút đặt tên không rõ ràng cho phương thức xác thực này. Nhưng điều này không có nghĩa là bạn không cần mật khẩu để đăng nhập bằng root. Tuy nhiên, một phương pháp an toàn hơn là đặt PermitRootLogin novà sử dụng một tài khoản sudo khác để đăng nhập, vì root là mục tiêu chung
BlueCacti

5

Các câu trả lời khác đang sử dụng iptables -Itrong các ví dụ của họ, thường không phải là những gì bạn nên sử dụng.

iptables sẽ thực thi quy tắc đầu tiên phù hợp, vì vậy thứ tự của các quy tắc là rất quan trọng. -Ilà lệnh "insert" và nên được sử dụng với tham số chỉ mục để chỉ định vị trí trong danh sách quy tắc đã cho. -Alà lệnh "chắp thêm", sẽ thêm quy tắc vào cuối danh sách.

Trong một số biến dạng (có lẽ là tất cả) sử dụng -Imà không có tham số chỉ mục sẽ thêm quy tắc vào chỉ mục một, làm cho nó trở thành quy tắc đầu tiên được kiểm tra. Trong trường hợp này nếu lệnh cuối cùng bạn chạy iptables -I INPUT -s tcp 0.0.0.0/0 -j DROPthì iptables sẽ giảm tất cả lưu lượng truy cập, bất kể bạn có bất kỳ ACCEPTquy tắc nào sau đó trong chuỗi hay không.

Đây là một mẫu thiết lập quy tắc chỉ cho phép SSH từ một IP duy nhất:

Bắt đầu mà không có quy tắc:

#> iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Thêm quy tắc "cho phép SSH từ 1.2.3.4" mới:

#>iptables -A INPUT -p tcp -s 1.2.3.4 --dport 22 -j ACCEPT

Chặn SSH từ tất cả các IP khác:

#>iptables -A INPUT -p tcp -s 0.0.0.0/0 --dport 22 -j DROP

Bây giờ chuỗi INPUT của bạn sẽ trông như sau:

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     tcp  --  1.2.3.4              0.0.0.0/0            tcp dpt:22
DROP       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:22

Sau này, nếu bạn cần lập danh sách trắng IP thứ hai, bạn có thể sử dụng -Itham số để đặt nó trước quy tắc danh sách đen.

#>iptables -I INPUT 2 -p tcp -s 4.3.2.1 --dport 22 -j ACCEPT

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     tcp  --  1.2.3.4              0.0.0.0/0            tcp dpt:22
ACCEPT     tcp  --  4.3.2.1              0.0.0.0/0            tcp dpt:22
DROP       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:22

Lưu ý rằng việc sử dụng -I INPUT 2thêm quy tắc mới làm quy tắc số 2 và chuyển quy tắc DROP sang số 3.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.