특정 네트워크에서 들어오는 SSH 연결만 허용하도록 서버의 Iptable을 구성하려고 합니다.
그건 그렇고, 이것은 일련의 규칙입니다.
# Drop anything we aren't explicitly allowing. All outbound traffic is okay
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
:RH-Firewall-1-INPUT - [0:0]
-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp --icmp-type echo-reply -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp --icmp-type time-exceeded -j ACCEPT
# Accept Pings
-A RH-Firewall-1-INPUT -p icmp --icmp-type echo-request -j ACCEPT
# Log anything on eth0 claiming it's from a local or non-routable network
# If you're using one of these local networks, remove it from the list below
-A INPUT -i eth0 -s 10.0.0.0/8 -j LOG --log-prefix "IP DROP SPOOF A: "
-A INPUT -i eth0 -s 172.16.0.0/12 -j LOG --log-prefix "IP DROP SPOOF B: "
-A INPUT -i eth0 -s 192.168.0.0/16 -j LOG --log-prefix "IP DROP SPOOF C: "
-A INPUT -i eth0 -s 224.0.0.0/4 -j LOG --log-prefix "IP DROP MULTICAST D: "
-A INPUT -i eth0 -s 240.0.0.0/5 -j LOG --log-prefix "IP DROP SPOOF E: "
-A INPUT -i eth0 -d 127.0.0.0/8 -j LOG --log-prefix "IP DROP LOOPBACK: "
# Accept any established connections
-A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Accept ssh traffic. Restrict this to known ips if possible.
-A INPUT -p tcp -s 88.253.5.38 --dport 22 -j ACCEPT
# Opening port 80 and port 443 in order to allow http and https requests
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
#Log and drop everything else
-A RH-Firewall-1-INPUT -j LOG
-A RH-Firewall-1-INPUT -j DROP
COMMIT
다음 명령을 사용하여 이러한 규칙을 저장하면 올바르게 적용되는 것 같습니다.
/etc/init.d/iptables 재시작&& iptables 서비스 저장
# iptables -nvL
Chain INPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
25332 17M RH-Firewall-1-INPUT all -- * * 0.0.0.0/0 0.0.0.0/0
0 0 LOG all -- eth0 * 10.0.0.0/8 0.0.0.0/0 LOG flags 0 level 4 prefix `IP DROP SPOOF A: '
0 0 LOG all -- eth0 * 172.16.0.0/12 0.0.0.0/0 LOG flags 0 level 4 prefix `IP DROP SPOOF B: '
0 0 LOG all -- eth0 * 192.168.0.0/16 0.0.0.0/0 LOG flags 0 level 4 prefix `IP DROP SPOOF C: '
0 0 LOG all -- eth0 * 224.0.0.0/4 0.0.0.0/0 LOG flags 0 level 4 prefix `IP DROP MULTICAST D: '
0 0 LOG all -- eth0 * 240.0.0.0/5 0.0.0.0/0 LOG flags 0 level 4 prefix `IP DROP SPOOF E: '
0 0 LOG all -- eth0 * 0.0.0.0/0 127.0.0.0/8 LOG flags 0 level 4 prefix `IP DROP LOOPBACK: '
0 0 ACCEPT tcp -- * * 88.253.5.38 0.0.0.0/0 tcp dpt:22
Chain FORWARD (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 RH-Firewall-1-INPUT all -- * * 0.0.0.0/0 0.0.0.0/0
Chain OUTPUT (policy ACCEPT 25163 packets, 17M bytes)
pkts bytes target prot opt in out source destination
Chain RH-Firewall-1-INPUT (2 references)
pkts bytes target prot opt in out source destination
24175 17M ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 icmp type 0
0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 icmp type 3
0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 icmp type 11
0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 icmp type 8
1052 121K ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
94 6016 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:443
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:80
11 440 LOG all -- * * 0.0.0.0/0 0.0.0.0/0 LOG flags 0 level 4
11 440 DROP all -- * * 0.0.0.0/0 0.0.0.0/0
내가 문제를 겪고 있는 주요 부분은 다음과 같습니다.
-A INPUT -p tcp -s 88.253.5.38 --dport 22 -j ACCEPT
내가 달성하고 싶은 것은 내가 있는 LAN에서만 연결을 허용하는 것입니다. 이에 대해 확인했습니다.여기에서내 라우터의 외부 IP(고정 IP)가 반환됩니다.88.253.5.38
내 주요 질문은 '라우터의 외부 IP를 사용하여 올바른 일을 하고 있습니까?'입니다. 아니면 내 컴퓨터의 내부 IP를 사용해야 합니까, 아니면 내부 IP 주소 범위를 사용해야 합니까?
아니면 제가 하려는 구성을 허용하지 않는 체인 전반에 걸쳐 충돌이 있을 수 있나요?
밀어주셔서 감사합니다. 정말 막혔어요
답변1
라우터의 외부 IP를 사용하여 올바른 일을 하고 있습니까? 아니면 내 컴퓨터의 내부 IP를 사용해야 합니까, 아니면 내부 IP 주소 범위를 사용해야 합니까?
핵심요약: 서버가 자신의 컴퓨터에서 "인터넷을 통해" 연결되어 있는 경우 규칙에서 라우터 주소를 사용할 수 있습니다 iptables
.
더 긴 답변:
방화벽 규칙은 방화벽으로 보호되는 장치의 관점에서 작동합니다. 이상적으로는 전 세계의 모든 장치에는 고유한 IP 주소가 있습니다. 하지만 그렇지 않습니다. NAT라는 추악한 해킹이 있습니다. 간단한 경우 이는 다양한 IP 주소(예: 192.168.1.*)를 가져와 단일 IP 주소에 매핑하는 장치 또는 소프트웨어입니다. 192.168.* 주소는 라우팅 불가능이 보장되므로 실제 인터넷에서는 절대 찾을 수 없습니다. 각 개인의 네트워크는 NAT 장치 뒤에 숨겨져 있으므로 각 네트워크는 하나의 고유한 IP 주소로 나타납니다. 따라서 다른 사람들이 직접 볼 수 없기 때문에 많은 사람들이 내부 네트워크에서 동일한 주소 범위 192.168.*을 사용할 수 있습니다.
그래서 질문으로 돌아갑니다.
서버가 NAT 네트워크 "외부"에 있는 경우 단일 공용 주소만 표시됩니다. 이것이 iptables
규칙에 포함되어야 하는 내용입니다.
반면, 서버가 자체 네트워크에 연결되어 있고 서버 사이에 NAT 장치가 없는 경우에는 실제 내부 주소를 사용해야 합니다.
이는 IPv4 인터넷 주소 지정의 추악한 현실을 매우 단순화한 버전이지만 시작하는 데 도움이 됩니다.
이제 특정 질문에 대답하자면 이것이 iptables
규칙이 예상대로 작동하지 않는 이유입니다. 체인부터 시작 INPUT
하여 진행해 보세요. 첫 번째 줄은 chain 이라고 합니다 RH-Firewall-1-INPUT
. 이렇게 하면 ACCEPT
포트 80과 443의 트래픽에 대한 한 쌍의 규칙이 표시됩니다. 그리고 DROP
다른 모든 것에도 적용되는 규칙이 있습니다 . 체인의 끝에서 우리는 돌아가서 포트 22 INPUT
에 도달합니다 ACCEPT
. 그러나 이 시점에서는 모든 트래픽이 삭제되었으므로 규칙은 중요하지 않습니다.
ACCEPT
여기서 해결 방법은 포트 22에 대한 규칙을 RH-Firewall-1-INPUT
포트 80 및 443에 대한 규칙 바로 뒤, catch-all 앞에 체인 으로 이동하는 것입니다 DROP
.
올바른 해결책은 사용법을 배우는 것이라고 생각 firewalld
하지만 CentOS 6.x에서 사용할 수 있는지 아니면 CentOS 7에서만 처음 등장했는지는 알 수 없습니다.
답변2
따라서 귀하의 규칙은 다음과 같습니다.
INPUT
체인 추가- TCP를 사용하고 포트 22로 향하는 패킷의 경우
- 이 소스 주소에서
- 우리는 그것을 받아들일 것입니다.
이를 수행하는 방법에는 두 가지가 있습니다. 귀하의 질문은 (적어도 나에게는) 약간 모호해 보이므로 세 가지 경우 모두 답변하겠습니다.
장면 1
주어진 공용 IP 주소를 사용하는 모든 사람이 이 상자에 액세스할 수 있기를 원합니다.
이것이 현재 귀하의 규칙이 말하는 것입니다. 제가 집에 있고 공용 IP가 있다면 88.253.5.38
직장이나 어디서나 SSH를 통해 귀하의 컴퓨터에 연결할 수 있습니다. *
* 정확하지 않을 수도 있지만 단순화를 위해 무시하겠습니다. 예를 들어, 다른 방화벽 뒤에 이 상자가 있는 경우 전달해야 합니다.
장면 2
사무실(또는 내부 네트워크)에 있는 누군가가 이 상자에 액세스할 수 있기를 원합니다.
규칙을 조금만 변경하면 됩니다. IP만 변경됩니다.
따라서 저는 10.0.0.0/8 네트워크에 있고 제 워크스테이션의 고정 IP는 10.0.0.127입니다. 그러면 규칙을 다음과 같이 변경할 수 있습니다.
-A INPUT -p tcp -s 10.0.0.127 --dport 22 -j ACCEPT
이는 워크스테이션 IP가 10.0.0.128인 Bob이 SSH를 통해 이 시스템에 액세스할 수 없음을 의미합니다.
장면 3
사무실(또는 내부 네트워크)의 모든 사람이 이 상자에 액세스할 수 있기를 원합니다.
귀하의 규칙이 가장 많이 변경되었지만 여전히 그다지 많지는 않습니다.
다시 한 번 말씀드리지만 저는 10.0.0.0/8 네트워크에 있고 10.0.0.1-10.0.0.254 범위의 IP를 가진 사람이라면 누구나 이 상자에 액세스할 수 있기를 바랍니다. 글쎄, 나는 이것이 /24 네트워크라는 것을 알고 있습니다.
-A INPUT -p tcp -s 10.0.0.0/24 --dport 22 -j ACCEPT
이는 IP 10.0.0.1.127을 사용하는 Charlie가 SSH를 통해 이 상자에 액세스할 수 없음을 의미합니다.
이것이 귀하의 문제를 해결하기를 바랍니다!
답변3
방화벽을 끄고 SSH를 통해 서버에 연결해 보세요. 마지막으로 입력하여 현재 IP를 확인하세요. 새로운(내 예상) IP 주소로 재구성할 때 iptables를 켜십시오.